package com.ctshk.rpc.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ctshk.common.dto.Result;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.common.utils.EntityUtil;
import com.ctshk.common.utils.SnowflakeIdWorker;
import com.ctshk.rpc.system.dto.ScenicProdutTypeIncoDTO;
import com.ctshk.rpc.system.entity.ScenicProdutTypeIcon;
import com.ctshk.rpc.system.mapper.MainScenicProductTypeMapper;
import com.ctshk.rpc.system.req.MainDataScenicProductTypeAddReq;
import com.ctshk.rpc.system.service.IMainScenicProductTypeService;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import org.apache.dubbo.config.annotation.DubboService;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description
 * @Author wansi <gaylen15527491065@yeah.net>
 * @Date 2021/4/22
 */
@DubboService
public class MainDataScenicScenicProductTypeServiceImpl extends ServiceImpl<MainScenicProductTypeMapper, ScenicProdutTypeIcon> implements IMainScenicProductTypeService {

    @Override
    public Result<PageResponse<ScenicProdutTypeIncoDTO>> list(MainDataScenicProductTypeAddReq req, TokenUser currentUser) {
        IPage<ScenicProdutTypeIcon> iPage = new Page<>(req.getPageNo(), req.getPageSize());
        QueryWrapper<ScenicProdutTypeIcon> queryWrapper = new QueryWrapper<>();
        if(req.getStatus() != null){
            queryWrapper.lambda().eq(ScenicProdutTypeIcon::getStatus,req.getStatus());
        }
        IPage<ScenicProdutTypeIcon> produtTypeIconIPage = baseMapper.selectPage(iPage, queryWrapper);
        List<ScenicProdutTypeIncoDTO> scenicProdutTypeIncoDTOS = EntityUtil.copyList(produtTypeIconIPage.getRecords(), ScenicProdutTypeIncoDTO.class);
        return Result.success(new PageResponse<>(scenicProdutTypeIncoDTOS, produtTypeIconIPage.getCurrent() == 1, produtTypeIconIPage.getTotal() <= (produtTypeIconIPage.getCurrent() * produtTypeIconIPage.getSize()), produtTypeIconIPage.getTotal(), produtTypeIconIPage.getCurrent(), produtTypeIconIPage.getSize()));
    }

    @Override
    public Result add(MainDataScenicProductTypeAddReq req, TokenUser currentUser) {
        ScenicProdutTypeIcon scenicProdutTypeIcon = EntityUtil.copy(req, ScenicProdutTypeIcon.class);
        scenicProdutTypeIcon.setId(SnowflakeIdWorker.nextId());
        scenicProdutTypeIcon.setGmtCreate(LocalDateTime.now());
        scenicProdutTypeIcon.setStatus(1);
        scenicProdutTypeIcon.setModifiedId(currentUser.getId());
        scenicProdutTypeIcon.setGmtModified(LocalDateTime.now());
        return Result.success(baseMapper.insert(scenicProdutTypeIcon));
    }

    @Override
    public Result edit(MainDataScenicProductTypeAddReq req, TokenUser currentUser) {
        ScenicProdutTypeIcon scenicProdutTypeIcon = baseMapper.selectById(req.getId());
        scenicProdutTypeIcon.setName(req.getName());
        scenicProdutTypeIcon.setPhotos(req.getPhotos());
        scenicProdutTypeIcon.setModifiedId(currentUser.getId());
        scenicProdutTypeIcon.setGmtModified(LocalDateTime.now());
        return Result.success(baseMapper.updateById(scenicProdutTypeIcon));
    }

    @Override
    public Result getFunType() {
        QueryWrapper<ScenicProdutTypeIcon> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(ScenicProdutTypeIcon::getStatus,1);
        List<ScenicProdutTypeIcon> scenicProdutTypeIcons = baseMapper.selectList(queryWrapper);
        if(CollectionUtils.isNotEmpty(scenicProdutTypeIcons)){
            return Result.success(scenicProdutTypeIcons.stream().map(entity->{
                ScenicProdutTypeIncoDTO dto = new ScenicProdutTypeIncoDTO();
                dto.setId(entity.getId());
                dto.setName(entity.getName());
                return dto;
            }).collect(Collectors.toList()));
        }
        return Result.success();
    }

    @Override
    public Result updateStatus(MainDataScenicProductTypeAddReq mainDataScenicProductTypeAddReq) {
        ScenicProdutTypeIcon scenicProdutTypeIcon = baseMapper.selectById(mainDataScenicProductTypeAddReq.getId());
        scenicProdutTypeIcon.setStatus(mainDataScenicProductTypeAddReq.getStatus());
        baseMapper.updateById(scenicProdutTypeIcon);
        return Result.success();
    }

    @Override
    public Result<PageResponse<ScenicProdutTypeIncoDTO>> getTypeList(MainDataScenicProductTypeAddReq req, TokenUser currentUser) {
        IPage<ScenicProdutTypeIcon> iPage = new Page<>(req.getPageNo(), req.getPageSize());
        LambdaQueryWrapper<ScenicProdutTypeIcon> eq = new QueryWrapper<ScenicProdutTypeIcon>().lambda().eq(ScenicProdutTypeIcon::getStatus, 0);
        IPage<ScenicProdutTypeIcon> produtTypeIconIPage = baseMapper.selectPage(iPage, eq);
        List<ScenicProdutTypeIncoDTO> localFunIncoDTOS = new ArrayList<>();
        for(ScenicProdutTypeIcon typeIcon:produtTypeIconIPage.getRecords()) {
            ScenicProdutTypeIncoDTO incoDTO = new ScenicProdutTypeIncoDTO();
            incoDTO.setId(typeIcon.getId());
            incoDTO.setName(typeIcon.getName());
            localFunIncoDTOS.add(incoDTO);
        }
        return Result.success(new PageResponse<>(localFunIncoDTOS, produtTypeIconIPage.getCurrent() == 1, produtTypeIconIPage.getTotal() <= (produtTypeIconIPage.getCurrent() * produtTypeIconIPage.getSize()), produtTypeIconIPage.getTotal(), produtTypeIconIPage.getCurrent(), produtTypeIconIPage.getSize()));
    }
}
